package com.quanxiaoha.weblog.common.domain.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.quanxiaoha.weblog.common.domain.dos.UserFavoriteDO;

import java.util.List;
import java.util.Objects;

/**
 * 用户收藏Mapper
 */
public interface UserFavoriteMapper extends BaseMapper<UserFavoriteDO> {

    /**
     * 根据用户ID查询收藏记录
     * @param userId 用户ID
     * @param type 类型：1-喜欢 2-收藏
     * @return 收藏记录列表
     */
    default List<UserFavoriteDO> selectByUserId(Long userId, Integer type) {
        LambdaQueryWrapper<UserFavoriteDO> wrapper = Wrappers.<UserFavoriteDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserFavoriteDO::getUserId, userId)
                .eq(Objects.nonNull(type), UserFavoriteDO::getType, type)
                .eq(UserFavoriteDO::getIsDeleted, false)
                .orderByDesc(UserFavoriteDO::getCreateTime);
        return selectList(wrapper);
    }

    /**
     * 根据会话ID查询收藏记录
     * @param sessionId 会话ID
     * @param type 类型：1-喜欢 2-收藏
     * @return 收藏记录列表
     */
    default List<UserFavoriteDO> selectBySessionId(String sessionId, Integer type) {
        LambdaQueryWrapper<UserFavoriteDO> wrapper = Wrappers.<UserFavoriteDO>lambdaQuery()
                .eq(Objects.nonNull(sessionId), UserFavoriteDO::getSessionId, sessionId)
                .eq(Objects.nonNull(type), UserFavoriteDO::getType, type)
                .eq(UserFavoriteDO::getIsDeleted, false)
                .orderByDesc(UserFavoriteDO::getCreateTime);
        return selectList(wrapper);
    }

    /**
     * 查询用户收藏的文章（分页）
     * @param userId 用户ID
     * @param sessionId 会话ID
     * @param type 类型：1-喜欢 2-收藏
     * @param page 分页对象
     * @return 收藏记录分页
     */
    default Page<UserFavoriteDO> selectFavoriteArticles(Long userId, String sessionId, Integer type, Page<UserFavoriteDO> page) {
        LambdaQueryWrapper<UserFavoriteDO> wrapper = Wrappers.<UserFavoriteDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserFavoriteDO::getUserId, userId)
                .eq(Objects.nonNull(sessionId), UserFavoriteDO::getSessionId, sessionId)
                .eq(Objects.nonNull(type), UserFavoriteDO::getType, type)
                .eq(UserFavoriteDO::getIsDeleted, false)
                .orderByDesc(UserFavoriteDO::getCreateTime);
        return selectPage(page, wrapper);
    }

    /**
     * 检查用户是否已收藏某篇文章
     * @param userId 用户ID
     * @param sessionId 会话ID
     * @param articleId 文章ID
     * @param type 类型：1-喜欢 2-收藏
     * @return 收藏记录
     */
    default UserFavoriteDO selectFavoriteByUserAndArticle(Long userId, String sessionId, Long articleId, Integer type) {
        LambdaQueryWrapper<UserFavoriteDO> wrapper = Wrappers.<UserFavoriteDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserFavoriteDO::getUserId, userId)
                .eq(Objects.nonNull(sessionId), UserFavoriteDO::getSessionId, sessionId)
                .eq(UserFavoriteDO::getArticleId, articleId)
                .eq(Objects.nonNull(type), UserFavoriteDO::getType, type)
                .eq(UserFavoriteDO::getIsDeleted, false);
        return selectOne(wrapper);
    }

    /**
     * 检查用户是否已收藏某篇文章（包括已删除的记录）
     * @param userId 用户ID
     * @param sessionId 会话ID
     * @param articleId 文章ID
     * @param type 类型：1-喜欢 2-收藏
     * @return 收藏记录
     */
    default UserFavoriteDO selectFavoriteByUserAndArticleIncludeDeleted(Long userId, String sessionId, Long articleId, Integer type) {
        LambdaQueryWrapper<UserFavoriteDO> wrapper = Wrappers.<UserFavoriteDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserFavoriteDO::getUserId, userId)
                .eq(Objects.nonNull(sessionId), UserFavoriteDO::getSessionId, sessionId)
                .eq(UserFavoriteDO::getArticleId, articleId)
                .eq(Objects.nonNull(type), UserFavoriteDO::getType, type);
        return selectOne(wrapper);
    }

    /**
     * 统计用户收藏文章总数
     * @param userId 用户ID
     * @param sessionId 会话ID
     * @param type 类型：1-喜欢 2-收藏
     * @return 收藏总数
     */
    default Long countFavoriteByUser(Long userId, String sessionId, Integer type) {
        LambdaQueryWrapper<UserFavoriteDO> wrapper = Wrappers.<UserFavoriteDO>lambdaQuery()
                .eq(Objects.nonNull(userId), UserFavoriteDO::getUserId, userId)
                .eq(Objects.nonNull(sessionId), UserFavoriteDO::getSessionId, sessionId)
                .eq(Objects.nonNull(type), UserFavoriteDO::getType, type)
                .eq(UserFavoriteDO::getIsDeleted, false);
        return selectCount(wrapper);
    }
}
